package com.ftg.learn.chapter13;

import javax.print.attribute.standard.PrinterStateReason;
import java.math.BigDecimal;
import java.util.*;
import java.util.function.DoubleBinaryOperator;
import java.util.function.IntBinaryOperator;
import java.util.function.IntConsumer;
import java.util.stream.Collectors;
import java.util.stream.DoubleStream;
import java.util.stream.IntStream;
import java.util.stream.Stream;

/**
 * 学习一下其它方法
 *
 * @author kangjx
 * @version 1.0
 * @date 2023/2/16 上午9:36
 */
public class LearnStream02 {

//           BaseStream
//    Stream IntStream DoubleStream LongStream

    public static void main(String[] args) {
        Employeer[] emps = new Employeer[8];
        //聚合统计功能
        // 列出我们公司员工资大15000 和小于15000

        emps[0] = new Employeer("张三", new BigDecimal("10000"), "男", 1);
        emps[1] = new Employeer("李四", new BigDecimal("12000"), "男", 1);
        emps[2] = new Employeer("王五", new BigDecimal("18000"), "男", 1);
        emps[3] = new Employeer("李二狗", new BigDecimal("18000"), "男", 1);
        emps[4] = new Employeer("王春花", new BigDecimal("18000"), "女", 1);
        emps[5] = new Employeer("史小丽", new BigDecimal("18000"), "女", 1);
        emps[6] = new Employeer("高启强", new BigDecimal("18000"), "男", 1);
        emps[7] = new Employeer("王二狗", new BigDecimal("18000"), "男", 1);

        //1 : 按照姓分组显示我们公司的全部员工信息
        //2 : 按照工资是否大于15000。。。
        //3 ： 分数... |

        //是否可以使用stream  collect 终止方法
        //groupingBy 分组.... 把大量数据 按分组的条件转换成特定的 几列
        // 聚合概念 ()
        Arrays.stream(emps).collect(Collectors.groupingBy(Employeer::getSex)).forEach((x, y) -> {
//            printf(模板 %s(字符串) %d (数字) %c [占位符],参数...)
            System.out.printf("当前是一个map你看的是key:%s\t，value：%s \n", x, y);
        });

        Map<String, List<Employeer>> map = Arrays.stream(emps).collect(Collectors.groupingBy(Employeer::getSex));
        System.out.println(map);
//        maxBy max一样的功能
        //求出工资最高的员工信息
        Optional<Employeer> collect = Arrays.stream(emps).collect(Collectors.maxBy((x, y) -> x.getSal().subtract(y.getSal()).intValue()));
        System.out.println(collect.get().getName());


//        Map<String, List<Employeer>> map = new HashMap<>();
//
//        List<Employeer> big = new ArrayList<>();
//        List<Employeer> little = new ArrayList<>();
//
//        for (Employeer emp : emps) {
//            if(emp.getSal().doubleValue() > 15000){
//                big.add(emp);
//            }else{
//                little.add(emp);
//            }
//        }
//        map.put("大于15000",big);
//        map.put("小于15000",little);
//
//        System.out.println(map);
//
        int[] as = new int[]{1, 2, 3, 4, 5};
        int identity = 10;
        for (int i = 0; i < as.length; i++) {
            identity += as[i];
        }
        System.out.println(identity);
        int t = 100;
        int sum = Arrays.stream(as).reduce(0, Integer::sum);
        OptionalInt sum1 = Arrays.stream(as).reduce(Integer::sum);
        System.out.println(sum1.getAsInt());
        DoubleStream.of(23,45,56,67.67d).reduce(Double::sum);
        DoubleStream.of(23,45,56,67.67d).reduce(new DoubleBinaryOperator() {
            @Override
            public double applyAsDouble(double left, double right) {
                return left - right;
            }
        });
        DoubleStream.of(23,45,56,67.67d).reduce((left,right)->left-right);
        DoubleStream.of(23.56d,23,45,56,67.67d).reduce(Double::sum);


    }

//    interface Abc{
//
//        int bijiao(int x,int y);
//    }
//
//    public int compareMy(int[] as,Abc a){
//        int n = 0;
//        for (int i = 0; i < as.length; i++) {
//            if( a.bijiao(n,as[i]) > 0){
//                n = as[i];
//            }
//        }
//    }

}
